package cn.ac.zing.server.hj212.context;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.AttributeKey;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.concurrent.ConcurrentHashMap;

/**
 *
 * @Author：dcy
 * @name：ChannelHandlerContextHolder
 * @Date：2024/5/21 9:25
 */
@Slf4j
public class ChannelContextHolder {

    private static final ConcurrentHashMap<String, ChannelHandlerContext> SESSION_MAP = new ConcurrentHashMap<>();

    private static final AttributeKey<String> SESSION_KEY = AttributeKey.valueOf("MN");

    public static Channel getChannelByMN(String mn) {
        if (!SESSION_MAP.containsKey(mn)) {
            log.error("Channel[{}] 不存在", mn);
            return null;
        }
        return SESSION_MAP.get(mn).channel();
    }

    public static ChannelHandlerContext getChannelHandlerContextByMN(String mn) {
        if (!SESSION_MAP.containsKey(mn)) {
            log.error("ChannelHandlerContext[{}] 不存在", mn);
            return null;
        }
        return SESSION_MAP.get(mn);
    }

    public static void putChannelHandlerContext(ChannelHandlerContext ctx, String mn) {
        SESSION_MAP.put(mn, ctx);
    }

    public static boolean removeChannelHandlerContext(String mn) {
        if (SESSION_MAP.containsKey(mn)) {
            SESSION_MAP.remove(mn);
            return true;
        }
        log.error("ChannelHandlerContext[{}] 不存在", mn);
        return false;
    }

    public static boolean removeChannelHandlerContext(ChannelHandlerContext ctx) {
        String mn = ctx.attr(SESSION_KEY).get();
        if (StringUtils.isBlank(mn)) {
            log.error("Channel[{}] 没有绑定MN", ctx.channel().id().toString());
            return false;
        }
        if (SESSION_MAP.containsKey(mn)) {
            SESSION_MAP.remove(mn);
            return true;
        }
        log.error("ChannelHandlerContext[{}] 不存在", mn);
        return false;
    }

    public static AttributeKey<String> getSessionKey() {
        return SESSION_KEY;
    }


    public static String getMN(ChannelHandlerContext ctx) {
        String mn = ctx.attr(SESSION_KEY).get();
        if (StringUtils.isBlank(mn)) {
            log.error("Channel[{}] 没有绑定MN", ctx.channel().id().toString());
        }
        return mn;
    }
}
